package com.ld.poetry.controller;


import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.ld.poetry.aop.LoginCheck;
import com.ld.poetry.config.PoetryResult;
import com.ld.poetry.aop.SaveCheck;
import com.ld.poetry.dao.ArticleMapper;
import com.ld.poetry.entity.Article;
import com.ld.poetry.entity.WeiYan;
import com.ld.poetry.service.WeiYanService;
import com.ld.poetry.constants.CommonConst;
import com.ld.poetry.enums.PoetryEnum;
import com.ld.poetry.utils.PoetryUtil;
import com.ld.poetry.utils.StringUtil;
import com.ld.poetry.vo.BaseRequestVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;

/**
 * <p>
 * 微言表 前端控制器
 * </p>
 *
 * @author sara
 * @since 2021-10-26
 */
@RestController
@RequestMapping("/weiYan")
public class WeiYanController {

    @Autowired
    private WeiYanService weiYanService;

    @Autowired
    private ArticleMapper articleMapper;

    /**
     * 保存微言
     * 用于用户发布新的微言内容
     * 
     * @param weiYanVO 微言信息，包含内容和可见性设置
     * @return PoetryResult 操作结果
     * @apiNote 需要用户登录且通过保存检查
     */
    @PostMapping("/saveWeiYan")
    @LoginCheck
    @SaveCheck
    public PoetryResult saveWeiYan(@RequestBody WeiYan weiYanVO) {
        // 验证微言内容是否为空
        if (!StringUtils.hasText(weiYanVO.getContent())) {
            return PoetryResult.fail("微言不能为空！");
        }

        // 移除内容中的HTML标签并验证
        String content = StringUtil.removeHtml(weiYanVO.getContent());
        if (!StringUtils.hasText(content)) {
            return PoetryResult.fail("微言内容不合法！");
        }
        weiYanVO.setContent(content);

        // 构建微言实体
        WeiYan weiYan = new WeiYan();
        // 设置发布者ID
        weiYan.setUserId(PoetryUtil.getUserId());
        // 设置处理后的内容
        weiYan.setContent(weiYanVO.getContent());
        // 设置可见性
        weiYan.setIsPublic(weiYanVO.getIsPublic());
        // 设置类型为朋友圈类型
        weiYan.setType(CommonConst.WEIYAN_TYPE_FRIEND);
        // 保存到数据库
        weiYanService.save(weiYan);
        return PoetryResult.success();
    }


    /**
     * 保存新闻类微言
     * 用于用户发布与文章相关的新闻类微言
     * 
     * @param weiYanVO 微言信息，包含内容、来源和创建时间
     * @return PoetryResult 操作结果
     * @apiNote 需要用户登录，且来源文章必须存在
     */
    @PostMapping("/saveNews")
    @LoginCheck
    public PoetryResult saveNews(@RequestBody WeiYan weiYanVO) {
        // 验证必要参数
        if (!StringUtils.hasText(weiYanVO.getContent()) || weiYanVO.getSource() == null) {
            return PoetryResult.fail("信息不全！");
        }

        // 设置创建时间，如果未提供则使用当前时间
        if (weiYanVO.getCreateTime() == null) {
            weiYanVO.setCreateTime(LocalDateTime.now());
        }

        // 获取当前用户ID
        Integer userId = PoetryUtil.getUserId();

        // 验证来源文章是否存在且属于当前用户
        LambdaQueryChainWrapper<Article> wrapper = new LambdaQueryChainWrapper<>(articleMapper);
        Integer count = wrapper.eq(Article::getId, weiYanVO.getSource())
                             .eq(Article::getUserId, userId)
                             .count();

        if (count == null || count < 1) {
            return PoetryResult.fail("来源不存在！");
        }

        // 构建微言实体
        WeiYan weiYan = new WeiYan();
        // 设置发布者ID
        weiYan.setUserId(userId);
        // 设置内容
        weiYan.setContent(weiYanVO.getContent());
        // 设置可见性为公开
        weiYan.setIsPublic(Boolean.TRUE);
        // 设置来源文章ID
        weiYan.setSource(weiYanVO.getSource());
        // 设置创建时间
        weiYan.setCreateTime(weiYanVO.getCreateTime());
        // 设置类型为新闻类型
        weiYan.setType(CommonConst.WEIYAN_TYPE_NEWS);
        // 保存到数据库
        weiYanService.save(weiYan);
        return PoetryResult.success();
    }

    /**
     * 查询微言列表
     * 根据用户ID查询朋友圈类型的微言列表
     * 支持分页查询，按创建时间倒序排序
     * 
     * @param baseRequestVO 查询参数，包含用户ID和分页信息
     * @return PoetryResult<BaseRequestVO> 包含分页结果的响应
     * @apiNote 根据查询用户和当前登录用户的关系决定可见性
     */
    @PostMapping("/listWeiYan")
    public PoetryResult<BaseRequestVO> listWeiYan(@RequestBody BaseRequestVO baseRequestVO) {
        // 构建查询条件
        LambdaQueryChainWrapper<WeiYan> lambdaQuery = weiYanService.lambdaQuery();
        // 设置类型为朋友圈类型
        lambdaQuery.eq(WeiYan::getType, CommonConst.WEIYAN_TYPE_FRIEND);

        // 处理用户ID查询逻辑
        if (baseRequestVO.getUserId() == null) {
            // 未指定用户ID的情况
            if (PoetryUtil.getUserId() != null) {
                // 当前用户已登录，查询自己的微言
                lambdaQuery.eq(WeiYan::getUserId, PoetryUtil.getUserId());
            } else {
                // 当前用户未登录，查询管理员的公开微言
                lambdaQuery.eq(WeiYan::getIsPublic, PoetryEnum.PUBLIC.getCode());
                lambdaQuery.eq(WeiYan::getUserId, PoetryUtil.getAdminUser().getId());
            }
        } else {
            // 指定了用户ID的情况
            if (!baseRequestVO.getUserId().equals(PoetryUtil.getUserId())) {
                // 查询其他用户的微言，只显示公开的
                lambdaQuery.eq(WeiYan::getIsPublic, PoetryEnum.PUBLIC.getCode());
            }
            // 设置查询的用户ID
            lambdaQuery.eq(WeiYan::getUserId, baseRequestVO.getUserId());
        }

        // 按创建时间倒序排序并分页
        lambdaQuery.orderByDesc(WeiYan::getCreateTime).page(baseRequestVO);
        return PoetryResult.success(baseRequestVO);
    }

    /**
     * 查询新闻列表
     * 根据来源文章ID查询相关的新闻类型微言列表
     * 支持分页查询，按创建时间倒序排序
     * 
     * @param baseRequestVO 查询参数，包含来源文章ID和分页信息
     * @return PoetryResult<BaseRequestVO> 包含分页结果的响应
     * @apiNote 只返回公开的新闻类型微言
     */
    @PostMapping("/listNews")
    public PoetryResult<BaseRequestVO> listNews(@RequestBody BaseRequestVO baseRequestVO) {
        // 验证来源文章ID是否为空
        if (baseRequestVO.getSource() == null) {
            return PoetryResult.fail("来源不能为空！");
        }

        // 构建查询条件
        LambdaQueryChainWrapper<WeiYan> lambdaQuery = weiYanService.lambdaQuery();
        // 设置类型为新闻类型
        lambdaQuery.eq(WeiYan::getType, CommonConst.WEIYAN_TYPE_NEWS);
        // 设置来源文章ID
        lambdaQuery.eq(WeiYan::getSource, baseRequestVO.getSource());
        // 只查询公开的新闻
        lambdaQuery.eq(WeiYan::getIsPublic, PoetryEnum.PUBLIC.getCode());

        // 按创建时间倒序排序并分页
        lambdaQuery.orderByDesc(WeiYan::getCreateTime).page(baseRequestVO);
        return PoetryResult.success(baseRequestVO);
    }

    /**
     * 删除微言
     * 根据微言ID删除指定的微言内容
     * 只能删除自己发布的微言
     * 
     * @param id 要删除的微言ID
     * @return PoetryResult 操作结果
     * @apiNote 需要用户登录，且只能删除自己的微言
     */
    @GetMapping("/deleteWeiYan")
    @LoginCheck
    public PoetryResult deleteWeiYan(@RequestParam("id") Integer id) {
        // 获取当前登录用户ID
        Integer userId = PoetryUtil.getUserId();
        
        // 根据微言ID和用户ID删除微言
        // 确保只能删除自己的微言
        weiYanService.lambdaUpdate()
                .eq(WeiYan::getId, id)           // 匹配微言ID
                .eq(WeiYan::getUserId, userId)   // 匹配用户ID
                .remove();
        return PoetryResult.success();
    }


}
